package edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.controller;

import edu.ynu.se.xiecheng.achitectureclass.common.dao.LogicDAO;
import edu.ynu.se.xiecheng.achitectureclass.common.entity.LogicEntity;
import edu.ynu.se.xiecheng.achitectureclass.common.service.LogicService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.List;

/**
 * 基础控制器
 * 设计原则体现：
 * 1. 泛型编程 - 使用泛型实现代码复用
 * 2. 模板方法模式 - 提供通用CRUD操作模板
 * 3. 开闭原则 - 通过抽象类设计，易于扩展
 */
@Api(tags ="基础Controller")
@CrossOrigin
public abstract class LogicController<S extends LogicService<D,T,ID>, 
                                    D extends LogicDAO<T,ID>,
                                    T extends LogicEntity, 
                                    ID extends Serializable> {
    
    // 依赖注入原则 - 通过构造函数注入服务
    protected S service;
    protected S getService(){
        return service;
    }
    public LogicController(S ls){
        this.service = ls;
    }

    /**
     * 查询操作
     * 设计原则体现：
     * 1. 命令查询分离(CQS) - 查询方法与修改方法分离
     * 2. RESTful设计 - 符合REST规范的API设计
     */
    @GetMapping("/get")
    @ApiOperation("通过ID获取实体")
    public T GET(@RequestParam ID id){
        return service.GET(id);
    }

    @ApiOperation("获取所有实体")
    @GetMapping("/getall")
    public List<T> getAll(){
        return service.getAll();
    }

    /**
     * 分页查询
     * 设计原则体现：
     * 1. 接口隔离原则 - 提供独立的分页查询接口
     * 2. 单一职责原则 - 方法职责单一明确
     */
    @ApiOperation("分页获取所有实体")
    @GetMapping("/getallPage")
    public Page<T> getAll(@RequestParam int page, @RequestParam int size){
        return service.getAll(page,size);
    }

    /**
     * 修改操作
     * 设计原则体现：
     * 1. 统一接口原则 - 统一的CRUD操作接口
     * 2. 里氏替换原则 - 子类可以替换父类的方法
     */
    @ApiOperation("修改实体")
    @PostMapping("/put")
    public T PUT(@RequestBody T entity){
        return service.PUT(entity);
    }

    @ApiOperation("创建实体")
    @PostMapping("/post")
    public T POST(@RequestBody T entity){
        return service.POST(entity);
    }

    /**
     * 删除操作
     * 设计原则体现：
     * 1. 方法重载 - 提供多种删除方式
     * 2. 接口一致性 - 保持删除操作的一致性
     */
    @ApiOperation("删除实体")
    @PostMapping("/delete")
    public void DELETE(@RequestBody T entity){
        service.DELETE(entity);
    }

    @ApiOperation("通过ID删除实体")
    @GetMapping("/delete")
    public void DELETE(@RequestParam ID id){
        service.DELETE(id);
    }
}
